Make scroll_to_path work for newly inserted items, by delaying the scroll
authorMatthias Clasen <mclasen@redhat.com>
Thu, 2 Mar 2006 19:52:26 +0000 (19:52 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Thu, 2 Mar 2006 19:52:26 +0000 (19:52 +0000)
2006-03-02  Matthias Clasen  <mclasen@redhat.com>

* gtk/gtkiconview.c (gtk_icon_view_layout)
(gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path):
Make scroll_to_path work for newly inserted items, by delaying
the scroll until layout is done.  (#332923, Cory Dodt)

ChangeLog
ChangeLog.pre-2-10
gtk/gtkiconview.c

index 6fbdc8b912529ce8a2cbc672a0d693ba3a2173ed..5f61228faa4c383ac20c2a907e88ac2aa3221c0e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,10 @@
 2006-03-02  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtkiconview.c (gtk_icon_view_layout) 
+       (gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path): 
+       Make scroll_to_path work for newly inserted items, by delaying
+       the scroll until layout is done.  (#332923, Cory Dodt)
+
        * gtk/gtkcolorbutton.c (render): Use GTK_WIDGET_IS_SENSITIVE,
        not GTK_WIDGET_SENSITIVE.  (#333133, Christian Persch)
 
index 6fbdc8b912529ce8a2cbc672a0d693ba3a2173ed..5f61228faa4c383ac20c2a907e88ac2aa3221c0e 100644 (file)
@@ -1,5 +1,10 @@
 2006-03-02  Matthias Clasen  <mclasen@redhat.com>
 
+       * gtk/gtkiconview.c (gtk_icon_view_layout) 
+       (gtk_icon_view_row_inserted, gtk_icon_view_scroll_to_path): 
+       Make scroll_to_path work for newly inserted items, by delaying
+       the scroll until layout is done.  (#332923, Cory Dodt)
+
        * gtk/gtkcolorbutton.c (render): Use GTK_WIDGET_IS_SENSITIVE,
        not GTK_WIDGET_SENSITIVE.  (#333133, Christian Persch)
 
index 05bec7202bf067fe003e951543b4363757a7e232..5de9f61102acfdf1cd6da7db95e63702ee182490 100644 (file)
@@ -2477,6 +2477,12 @@ gtk_icon_view_layout (GtkIconView *icon_view)
   gint row;
   gint item_width;
 
+  if (icon_view->priv->layout_idle_id != 0)
+    {
+      g_source_remove (icon_view->priv->layout_idle_id);
+      icon_view->priv->layout_idle_id = 0;
+    }
+  
   if (icon_view->priv->model == NULL)
     return;
 
@@ -2508,32 +2514,38 @@ gtk_icon_view_layout (GtkIconView *icon_view)
   while (icons != NULL);
 
   if (maximum_width != icon_view->priv->width)
-    {
-      icon_view->priv->width = maximum_width;
-    }
+    icon_view->priv->width = maximum_width;
+
   y += icon_view->priv->margin;
   
   if (y != icon_view->priv->height)
-    {
-      icon_view->priv->height = y;
-    }
+    icon_view->priv->height = y;
 
-  gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment, icon_view->priv->width);
-  gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment, icon_view->priv->height);
+  gtk_icon_view_set_adjustment_upper (icon_view->priv->hadjustment, 
+                                     icon_view->priv->width);
+  gtk_icon_view_set_adjustment_upper (icon_view->priv->vadjustment, 
+                                     icon_view->priv->height);
 
   if (GTK_WIDGET_REALIZED (icon_view))
-    {
-      gdk_window_resize (icon_view->priv->bin_window,
-                        MAX (icon_view->priv->width, widget->allocation.width),
-                        MAX (icon_view->priv->height, widget->allocation.height));
-    }
+    gdk_window_resize (icon_view->priv->bin_window,
+                      MAX (icon_view->priv->width, widget->allocation.width),
+                      MAX (icon_view->priv->height, widget->allocation.height));
 
-  if (icon_view->priv->layout_idle_id != 0)
+  if (icon_view->priv->scroll_to_path)
     {
-      g_source_remove (icon_view->priv->layout_idle_id);
-      icon_view->priv->layout_idle_id = 0;
-    }
+      GtkTreePath *path;
 
+      path = gtk_tree_row_reference_get_path (icon_view->priv->scroll_to_path);
+      gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
+      icon_view->priv->scroll_to_path = NULL;
+      
+      gtk_icon_view_scroll_to_path (icon_view, path,
+                                   icon_view->priv->scroll_to_use_align,
+                                   icon_view->priv->scroll_to_row_align,
+                                   icon_view->priv->scroll_to_col_align);
+      gtk_tree_path_free (path);
+    }
+  
   gtk_widget_queue_draw (GTK_WIDGET (icon_view));
 }
 
@@ -3271,6 +3283,8 @@ gtk_icon_view_row_inserted (GtkTreeModel *model,
     }
     
   verify_items (icon_view);
+
+  gtk_icon_view_queue_layout (icon_view);
 }
 
 static void
@@ -3313,10 +3327,10 @@ gtk_icon_view_row_deleted (GtkTreeModel *model,
   
   icon_view->priv->items = g_list_delete_link (icon_view->priv->items, list);
 
-  gtk_icon_view_queue_layout (icon_view);
-
   verify_items (icon_view);  
   
+  gtk_icon_view_queue_layout (icon_view);
+
   if (emit)
     g_signal_emit (icon_view, icon_view_signals[SELECTION_CHANGED], 0);
 }
@@ -3959,7 +3973,11 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view,
   g_return_if_fail (row_align >= 0.0 && row_align <= 1.0);
   g_return_if_fail (col_align >= 0.0 && col_align <= 1.0);
 
-  if (! GTK_WIDGET_REALIZED (icon_view))
+  if (gtk_tree_path_get_depth (path) > 0)
+    item = g_list_nth_data (icon_view->priv->items,
+                           gtk_tree_path_get_indices(path)[0]);
+  
+  if (!GTK_WIDGET_REALIZED (icon_view) || !item || item->width < 0)
     {
       if (icon_view->priv->scroll_to_path)
        gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
@@ -3976,13 +3994,6 @@ gtk_icon_view_scroll_to_path (GtkIconView *icon_view,
       return;
     }
 
-  if (gtk_tree_path_get_depth (path) > 0)
-    item = g_list_nth_data (icon_view->priv->items,
-                           gtk_tree_path_get_indices(path)[0]);
-  
-  if (!item)
-    return;
-
   if (use_align)
     {
       gint x, y;
@@ -4031,7 +4042,7 @@ gtk_icon_view_scroll_to_item (GtkIconView     *icon_view,
   gdk_drawable_get_size (GDK_DRAWABLE (icon_view->priv->bin_window), 
                         &width, &height);
   gdk_window_get_position (icon_view->priv->bin_window, &x, &y);
-
+  
   if (y + item->y - focus_width < 0)
     gtk_adjustment_set_value (icon_view->priv->vadjustment, 
                              icon_view->priv->vadjustment->value + y + item->y - focus_width);